package org.example.mq.mqserver.core;

/*
    后续路由通过该类实现
 */
public class Route {
    public boolean checkRoutingKey(String routingKey){
        // routingKey 允许为空，不能包含非法字符（比如空格、特殊符号等）
        if (routingKey == null) return false;

        // 示例：只允许字母、数字、下划线、点号
        return routingKey.matches("^[a-zA-Z0-9_.]*$");
    };

    public boolean checkBindingKey(String bindingKey,ExchangeType exchangeType){
        if(exchangeType==ExchangeType.DIRECT){
            // Direct 模式下，bindingKey 可以为空，但只能包含合法字符
            // 合法字符为：字母、数字、下划线、点
            return bindingKey.matches("^[a-zA-Z0-9_.]*$");
        }
        else if(exchangeType==ExchangeType.FANOUT){
            // Fanout 模式下，bindingKey 可以为空或任意值，不参与路由逻辑
            return true;
        }
        else if(exchangeType==ExchangeType.TOPIC){
            // 正则匹配基本结构：允许 a-zA-Z0-9 _ * # 和点
            if (!bindingKey.matches("^[a-zA-Z0-9*#_]+(\\.[a-zA-Z0-9*#_]+)*$")) {
                return false;
            }

            String[] parts = bindingKey.split("\\.");

            for (int i = 0; i < parts.length; i++) {
                String part = parts[i];

                // 必须是 *、# 或者普通单词
                if (part.equals("#")) {
                    //检查后面是否跟着# 或者 *
                    if(i+1<parts.length) {
                        if (parts[i + 1].equals("#") || parts[i + 1].equals("*")) {
                            return false;
                        }
                    }
                }
                else if(part.equals("*")){
                    //后面不能跟上#
                    if(i+1<parts.length) {
                        if (parts[i + 1].equals("#")) {
                            return false;
                        }
                    }
                }
                else {
                    // 非 * 或 #，必须是普通字符
                    if (!part.matches("^[a-zA-Z0-9_]+$")) return false;
                }
            }

            return true;
        }

        return true;
    }

    //交换机为topic模式判断消息是否可以转发
    public boolean topicRoute(String routingKey, String bindingKey) {
        String[] routingWords = routingKey.split("\\.");
        String[] bindingWords = bindingKey.split("\\.");

        int r = 0;
        int b = 0;

        //这里采用双指针来移动
        while(r<routingWords.length && b<bindingWords.length){
            String bw = bindingWords[b];
            if(bw.equals("*")){
                r++;
                b++;
            }
            else if(bw.equals("#")){
                //如果是末尾的直接就返回true
                if(b==bindingWords.length-1)return true;

                //如果不是末尾 rw需要等于 [b+1]
                if(!routingWords[r].equals(bindingWords[b+1])){
                    r++;
                }
                else{
                    b+=2;
                    r++;
                }
            }
            else{
                if(!routingWords[r].equals(bw))return false;
                r++;
                b++;
            }
        }

        if (r<routingWords.length || b<bindingWords.length)return false;

        return true;
    }
}
